package com.hysoft.web.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hysoft.common.dto.GridParams;
import com.hysoft.common.result.GridResult;
import com.hysoft.common.result.Result;
import com.hysoft.pdr.entity.base.BaseEntity;

import java.util.List;
import java.util.Map;

/**
 * <h1>公共service层接口</h1>
 *
 * @author 王天瑞
 * @param <T> 实体类类型
 */
public interface IBaseService<T extends BaseEntity> extends IService<T> {

    /**
     * <h2>新增或修改</h2>
     * @param entity 保存对象
     * @return 保存结果
     */
    Result<T> insertOrUpdate(T entity);

    /**
     * <h2>删除</h2>
     * @param ids 删除的主键集合
     * @return 删除结果
     */
    Result<List<String>> remove(List<String> ids);

    /**
     * <h2>根据主键id获取相应信息</h2>
     * @param id 主键id
     * @return 相应信息
     */
    Object get(String id);

    /**
     * <h2>根据参数查询表格数据</h2>
     * @param params 查询参数
     * @return 表格查询结果
     */
    GridResult<?> query(GridParams<Map<String, Object>> params);

    /**
     * <h2>保存前的校验方法，如果校验失败，则不进行保存</h2>
     * @param entity 保存前的对象
     * @return 是否校验成功
     */
    boolean beforeSave(T entity);

    /**
     * <h2>保存后的回调方法</h2>
     * @param entity 保存后的对象
     */
    void afterSave(T entity);

    /**
     * <h2>删除前的校验方法，如果校验失败，则不进行删除</h2>
     * @param entity 删除前的对象
     * @return 是否校验成功
     */
    boolean beforeDelete(T entity);

    /**
     * <h2>删除后的回调方法</h2>
     * @param entity 删除后的对象
     */
    void afterDelete(T entity);

    /**
     * <h2>根据主键id获取到entity实体类后进行相应扩展，返回null则无扩展</h2>
     * @param entity 根据主键id查询出来的结果
     * @return 扩展后的结果
     */
    Object extensionOne(T entity);

    /**
     * <h2>查询表格</h2>
     * @param page 分页对象
     * @param params 查询参数
     * @return 查询结果集
     */
    IPage<?> queryMapper(Page<Object> page, Map<String, Object> params);
}
